JSP로 DB 데이터 CRUD 실행
✒️ 2025-05-26 10:49 내용 수정
- CRUD : Create, Read, Update, Delete의 줄임말로, 데이터베이스의 내용을 조회, 추가, 수정, 삭제를 의미한다.
- 사용한 데이터베이스는 Oracle DB다.
- 기능을 추가할 때마다 코드를 수정했기에 몇몇 코드는 일부분만 수정되고 같은 코드이다.
사전 준비
- 이번엔 새로 생성한 계정을 사용하여 실습을 진행했다.
- 새 계정에서 학생 성적 관리를 위한 성적 테이블을 생성하고, 샘플 데이터를 추가한다.
- DDL(Data Definition Language), DML(Data Manipulation Language) 참고.
- 오라클과 연동#사전 준비의 내용대로 진행한다.
- 작업 표시줄의 검색에서 Start database를 입력해 실행창을 열고
sqlplus 계정명/비밀번호를 입력해 실습에 사용할 계정으로 접속한다. - 접속 후 시퀀스, 테이블, view를 생성하고 샘플 데이터를 추가한 후 commit 해준다.
-- SQEUNCE 생성
CREATE SEQUENCE SEQ_STD_NO;
-- 성적 테이블 생성
CREATE TABLE STD_SCORE (
NO INT PRIMARY KEY,
NAME VARCHAR2(100) NOT NULL,
KOR NUMBER(3) NOT NULL,
ENG NUMBER(3) NOT NULL,
MATH NUMBER(3) NOT NULL
);
-- 샘플 데이터 추가
INSERT INTO STD_SCORE VALUES(SEQ_STD_NO.nextVal, '홍길동', 50, 80, 93);
INSERT INTO STD_SCORE VALUES(SEQ_STD_NO.nextVal, '고길동', 100, 90, 87);
INSERT INTO STD_SCORE VALUES(SEQ_STD_NO.nextVal, '김길동', 80, 60, 47);
-- VIEW 추가
CREATE VIEW STD_VIEW AS (
SELECT S.*, (KOR+ENG+MATH) TOTAL, ROUND((KOR+ENG+MATH)/3, 1) AVG, RANK() OVER(ORDER BY (KOR+ENG+MATH) DESC) RANK FROM STD_SCORE S
);
-- commitsele
COMMIT;
데이터 조회
- 오라클과 연동#DAO를 사용한 DB 연결 방법으로 진행한다.
1. DB 연결 클래스 생성
- 데이터베이스에 연결하는 클래스를 생성한다.
- singleton pattern을 따르므로 한 번 인스턴스가 생성되면 이후 호출은 생성되어 있는 객체를 반환한다.
package DAO;
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class DBConnection {
static DBConnection db = null;
DataSource ds;
// singleton pattern으로 생성
public static DBConnection getInstance() {
if(db == null) {
db = new DBConnection();
}
return db;
}
// 생성자에서 Context 객체와 DataSource 초기화
public DBConnection() {
try {
InitialContext ic = new InitialContext();
Context ctx = (Context)ic.lookup("java:comp/env");
ds = (DataSource)ctx.lookup("jdbc/oracle_test");
} catch (NamingException e) {
e.printStackTrace();
}
}
// 생성자에서 준비한 정보로 DB에 연결하여 Connection 객체 얻기
public Connection getConnection() {
Connection connec = null;
try {
connec = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return connec;
}
}
2. DTO 클래스 생성
- DB의 STD_VIEW 의 속성을 저장할 클래스를 만든다.
package DTO;
public class STDScoreDTO {
private int no;
private String name;
private int kor;
private int eng;
private int math;
private int total;
private int rank;
private float avg;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public float getAvg() {
return avg;
}
public void setAvg(float avg) {
this.avg = avg;
}
}
3. DAO 클래스 생성
- DB에 데이터를 조회하기 위한 DAO 클래스를 생성한다.
package DAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import DTO.STDScoreDTO;
public class STDScoreDAO {
public static STDScoreDAO dao;
public static STDScoreDAO getInstance() {
if(dao == null) {
dao = new STDScoreDAO();
}
return dao;
}
// 데이터베이스와 연결하여 내용 조회
public List<STDScoreDTO> selectList() {
List<STDScoreDTO> list = new ArrayList<>();
Connection connec = null;
PreparedStatement prestat = null;
ResultSet rs = null;
String sql = "SELECT * FROM STD_VIEW";
try {
// 1. Connection 얻어오기
connec = DBConnection.getInstance().getConnection();
// 2. sql문 얻어오기
prestat = connec.prepareStatement(sql);
// 3. sql문 시행 겨로가 처리 객체 얻어오기
rs = prestat.executeQuery();
// 4. STDScoreDTO 필드에 속성을 저장하고 List에 저장하기
while(rs.next()) {
STDScoreDTO dto = new STDScoreDTO();
dto.setNo(rs.getInt("no"));
dto.setName(rs.getString("name"));
dto.setKor(rs.getInt("kor"));
dto.setEng(rs.getInt("eng"));
dto.setMath(rs.getInt("math"));
dto.setTotal(rs.getInt("total"));
dto.setAvg(rs.getFloat("avg"));
dto.setRank(rs.getInt("rank"));
list.add(dto);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (prestat != null) {
prestat.close();
}
if (connec != null) {
connec.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return list;
}
}
4. 성적 확인용 JSP 생성
- DB 연결 및 조회를 담당하는 클래스 객체를 생성하고, DB에 조회한 내용을 보여줄 웹 페이지를 만든다.
<%@page import="DTO.STDScoreDTO"%>
<%@page import="java.util.List"%>
<%@page import="DAO.STDScoreDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
STDScoreDAO dao = STDScoreDAO.getInstance();
List<STDScoreDTO> list = dao.selectList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
table{border: 1px solid black;
border-collapse: collapse;
text-align:center;}
th{width:80px;}
</style>
</head>
<body>
<table border="1">
<caption>==학생정보==</caption>
<tr>
<th>번호</th>
<th>이름</th>
<th>국어</th>
<th>영어</th>
<th>수학</th>
<th>총합</th>
<th>평균</th>
<th>순위</th>
<th>비고</th>
</tr>
<%
for(int i = 0; i < list.size(); i++) {
STDScoreDTO dto = list.get(i);
%>
<tr>
<td> <%= dto.getNo() %> </td>
<td> <%= dto.getName() %> </td>
<td> <%= dto.getKor() %> </td>
<td> <%= dto.getEng() %> </td>
<td> <%= dto.getMath() %> </td>
<td> <%= dto.getTotal() %> </td>
<td> <%= dto.getAvg() %> </td>
<td> <%= dto.getRank() %> </td>
<td><input type="button" value="삭제"></td>
</tr>
<% } %>
<tr>
<td colspan="9" align="center">
<input type="button" value="학생정보 추가하기" onclick="location.href='std_register.jsp'">
</td>
</tr>
</table>
</body>
</html>
데이터 추가
- 데이터 조회에서 미리 만들어둔 학생 정보 추가하기 버튼과 클래스들을 이용해 데이터를 추가하는 jsp와 새 테이블을 만든다.
location.href: 페이지를 이동하게 해주는 Javascript 코드
1. 학생 등록용 JSP 생성
- 웹 페이지에서 추가할 학생의 정보를 받고, 이를 등록용 JSP로 전달한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
function send(f) {
var name = f.name.value.trim();
var kor = f.kor.value.trim();
var eng = f.eng.value.trim();
var math = f.math.value.trim();
// 유효성 체크 - form.submit()을 그냥 하면 유효성 체크가 없이 전달됨
if (name == '') {
alert("이름을 입력해주세요.");
return;
}
var num = /^[0-9]{1,3}$/; // 정규 표현식으로 3자리 숫자 판별
if (!num.test(kor) || kor < 0 || kor > 100
|| !num.test(eng) || eng < 0 || eng > 100
|| !num.test(math) || math < 0 || math > 100)
{
alert("3 자리 이하의 정수만 입력해주세요.");
return;
}
// form 제출
f.action = "register.jsp";
f.submit();
}
</script>
</head>
<body>
<form>
<table>
<caption>학생 정보를 입력하세요</caption>
<tr>
<td>이름</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>국어성적</td>
<td><input type="text" name="kor"></td>
</tr>
<tr>
<td>영어성적</td>
<td><input type="text" name="eng"></td>
</tr>
<tr>
<td>수학성적</td>
<td><input type="text" name="math"></td>
</tr>
<tr>
<td colspan="2">
<input type="button" value="등록" onclick="send(this.form)">
<input type="button" value="취소" onclick="location.href='student_score.jsp'">
</td>
</tr>
</table>
</form>
</body>
</html>
2. 정보 전달용 JSP 생성
- std_register.jsp에서 전달 받은 내용을 데이터베이스에 전달하도록 DAO 객체를 호출한다.
<%@page import="DAO.STDScoreDAO"%>
<%@page import="DTO.STDScoreDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// std_register.jsp에서 전달받은 정보
String name = request.getParameter("name");
int kor = Integer.parseInt(request.getParameter("kor"));
int eng = Integer.parseInt(request.getParameter("eng"));
int math = Integer.parseInt(request.getParameter("math"));
// STDScoreDTO 객체에 정보 저장
STDScoreDTO dto = new STDScoreDTO();
dto.setName(name);
dto.setKor(kor);
dto.setEng(eng);
dto.setMath(math);
// STDScoreDAO 객체를 호출해서 STDScoreDTO 객체 정보를 DB에 전달
int result = STDScoreDAO.getInstance().insert(dto);
// DB에 전달이 성공적으로 이루어졌다면 다시 학생 성적 화면으로 복귀
if(result == 1) {
response.sendRedirect("student_score.jsp");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
3. DAO 수정
- DB에 데이터를 전달하기 위한 메소드를 추가한다.
// public List<STDScoreDTO> selectList() 메소드 아래에 insert 메소드 추가
// 학생의 성적 추가
public int insert(STDScoreDTO dto) {
int result = 0;
Connection connec = null;
PreparedStatement prestat = null;
String sql = "INSERT INTO STD_SCORE VALUES(SEQ_STD_NO.nextVal, ?, ?, ?, ?)";
try {
// 1. Connection 얻어오기
connec = DBConnection.getInstance().getConnection();
// 2. 명령 처리 객체 획득
prestat = connec.prepareStatement(sql);
// 3. prestat으로 sql문의 빈 자리 채우기
prestat.setString(1, dto.getName());
prestat.setInt(2, dto.getKor());
prestat.setInt(3, dto.getEng());
prestat.setInt(4, dto.getMath());
// 4. DB에 데이터 전송(result = 처리된 행의 수)
result = prestat.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (prestat != null) {
prestat.close();
}
if (connec != null) {
connec.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
4. 데이터 추가 테스트
-
서버를 가동하여 데이터를 실제로 입력하고, 등록 버튼을 누른다.
-
데이터가 제대로 추가 되었음을 확인할 수 있다.
-
DBeaver를 통해 접속한 DB에서도 추가된 내용을 확인할 수 있다.
데이터 삭제
- 데이터 조회에서 미리 만들어둔 삭제 버튼과 클래스들을 이용해 데이터를 삭제하는 jsp와 새 테이블을 만든다.
confirm("내용"): alert("내용")처럼 뜨는 팝업창으로, 예/아니오를 선택할 수 있는 Javascript 코드
1. 성적 확인용 JSP 수정
<%@page import="DTO.STDScoreDTO"%>
<%@page import="java.util.List"%>
<%@page import="DAO.STDScoreDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
STDScoreDAO dao = STDScoreDAO.getInstance();
List<STDScoreDTO> list = dao.selectList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
table{border: 1px solid black;
border-collapse: collapse;
text-align:center;}
th{width:80px;}
</style>
<script>
function del(no) {
// 삭제 재확인
if(confirm("정말 삭제하시겠습니까?") == false) {
return; // 삭제 취소
}
location.href = 'std_del.jps?no='+no;
}
</script>
</head>
<body>
<table border="1">
<caption>==학생정보==</caption>
<tr>
<th>번호</th>
<th>이름</th>
<th>국어</th>
<th>영어</th>
<th>수학</th>
<th>총합</th>
<th>평균</th>
<th>순위</th>
<th>비고</th>
</tr>
<%
for(int i = 0; i < list.size(); i++) {
STDScoreDTO dto = list.get(i);
%>
<tr>
<td> <%= dto.getNo() %> </td>
<td> <%= dto.getName() %> </td>
<td> <%= dto.getKor() %> </td>
<td> <%= dto.getEng() %> </td>
<td> <%= dto.getMath() %> </td>
<td> <%= dto.getTotal() %> </td>
<td> <%= dto.getAvg() %> </td>
<td> <%= dto.getRank() %> </td>
<td><input type="button" value="삭제" onclick="del('<%= dto.getNo()%>')"></td>
</tr>
<% } %>
<tr>
<td colspan="9" align="center">
<input type="button" value="학생정보 추가하기" onclick="location.href='std_register.jsp'">
</td>
</tr>
</table>
</body>
</html>
2. 삭제용 JSP 생성
<%@page import="DAO.STDScoreDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 인코딩 처리
request.setCharacterEncoding("utf-8");
// student_score.jsp에서 보낸 삭제 요청
int no = Integer.parseInt(request.getParameter("no"));
// DB에서 값을 제어
int result = STDScoreDAO.getInstance().delete(no);
if (result > 0) {
response.sendRedirect("student_score.jsp");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
오류가 발생했습니다.
</body>
</html>
3. DAO 수정
// public int insert() 메소드 아래에 delete() 메소드 추가
public int delete(int no) {
int result = 0;
Connection connec = null;
PreparedStatement prestat = null;
String sql = "DELETE FROM STD_SCORE WHERE NO =?";
try {
// 1. Connection 얻어오기
connec = DBConnection.getInstance().getConnection();
// 2. 명령 처리 객체 획득
prestat = connec.prepareStatement(sql);
// 3. prestat으로 sql문의 빈 자리 채우기
prestat.setInt(1, no);
// 4. DB에 제거할 데이터 정보 전송 및 데이터 제거
result = prestat.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (prestat != null) {
prestat.close();
}
if (connec != null) {
connec.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
- 삭제 버튼을 누르면 삭제 여부를 다시 묻는 팝업창이 뜬다.
- 확인을 누르면 선택한 학생 정보가 제거 되었음을 확인할 수 있다.
- 다만 이 상태에서 바로 학생 정보를 추가하면 시퀀스의 nextVal은 5번이므로 5번 학생으로 생성된다.
데이터 수정
- 데이터 삭제까지 만든 부분에서 이번엔 데이터 수정을 위한 기능을 추가한다.
1. 성적 확인용 JSP 수정
- std_update.jsp에 수정할 학생의 데이터를 전송한다.
<%@page import="DTO.STDScoreDTO"%>
<%@page import="java.util.List"%>
<%@page import="DAO.STDScoreDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
STDScoreDAO dao = STDScoreDAO.getInstance();
List<STDScoreDTO> list = dao.selectList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
table{border: 1px solid black;
border-collapse: collapse;
text-align:center;}
th{width:80px;}
</style>
<script>
function del(no) {
// 삭제 재확인
if(confirm("정말 삭제하시겠습니까?") == false) {
return; // 삭제 취소
}
location.href = 'std_del.jsp?no='+no;
}
function modify(no, name, kor, eng, math) {
location.href = 'std_update.jsp?no='+no+'&name='+name+'&kor='+kor+'&eng='+eng+'&math='+math;
}
</script>
</head>
<body>
<table border="1">
<caption>==학생정보==</caption>
<tr>
<th>번호</th>
<th>이름</th>
<th>국어</th>
<th>영어</th>
<th>수학</th>
<th>총합</th>
<th>평균</th>
<th>순위</th>
<th>비고</th>
</tr>
<%
for(int i = 0; i < list.size(); i++) {
STDScoreDTO dto = list.get(i);
%>
<tr>
<td> <%= dto.getNo() %> </td>
<td> <%= dto.getName() %> </td>
<td> <%= dto.getKor() %> </td>
<td> <%= dto.getEng() %> </td>
<td> <%= dto.getMath() %> </td>
<td> <%= dto.getTotal() %> </td>
<td> <%= dto.getAvg() %> </td>
<td> <%= dto.getRank() %> </td>
<td>
<input type="button" value="수정" onclick="modify('<%= dto.getNo() %>',
'<%= dto.getName() %>',
'<%= dto.getKor() %>',
'<%= dto.getEng() %>',
'<%= dto.getMath() %>')">
<input type="button" value="삭제" onclick="del('<%= dto.getNo()%>')">
</td>
</tr>
<% } %>
<tr>
<td colspan="9" align="center">
<input type="button" value="학생정보 추가하기" onclick="location.href='std_register.jsp'">
</td>
</tr>
</table>
</body>
</html>
2. 수정 화면 JSP 생성
- student_score.jsp에서 전달 받은 학생의 데이터를 웹 페이지에 표시하고, std_modify.jsp로 수정할 데이터를 전송한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
int no = Integer.parseInt(request.getParameter("no"));
int kor = Integer.parseInt(request.getParameter("kor"));
int eng = Integer.parseInt(request.getParameter("eng"));
int math = Integer.parseInt(request.getParameter("math"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
function update(f) {
var no = f.no.value.trim();
var name = f.name.value.trim();
var kor = f.kor.value.trim();
var eng = f.eng.value.trim();
var math = f.math.value.trim();
// 유효성 검사
if(name == '') {
alert("이름을 입력해주세요.");
return;
}
if(kor == '') {
alert("점수를 입력해주세요");
return;
}
if(eng == '') {
alert("점수를 입력해주세요");
return;
}
if(math == '') {
alert("점수를 입력해주세요");
return;
}
var num = /^[0-9]{1,3}$/;
if (!num.test(kor) || kor < 0 || kor > 100
|| !num.test(eng) || eng < 0 || eng > 100
|| !num.test(math) || math < 0 || math > 100)
{
alert("3 자리 이하의 정수만 입력해주세요.");
return;
}
f.action = "std_modify.jsp";
f.submit();
}
</script>
</head>
<body>
<form>
<input type="hidden" name="no" value="<%= no %>">
<table border="1">
<caption>학생정보 수정</caption>
<tr>
<th>이름</th>
<td><input name="name" value="<%= name %>"></td>
<tr>
<tr>
<th>국어</th>
<td><input name="kor" value="<%= kor %>"></td>
<tr>
<tr>
<th>영어</th>
<td><input name="eng" value="<%= eng %>"></td>
<tr>
<tr>
<th>수학</th>
<td><input name="math" value="<%= math %>"></td>
<tr>
<tr>
<td colspan="2">
<input type="button" value="수정" onclick="update(this.form)">
<input type="button" value="취소" onclick="location.href='student_score.jsp'">
</td>
</tr>
</table>
</form>
</body>
</html>
3. 수정 내용 전달 JSP 생성
- STDScoreDAO 객체를 호출하고 DB에 변경 내용을 전달할 웹 페이지를 생성한다.
<%@page import="DAO.STDScoreDAO"%>
<%@page import="DTO.STDScoreDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
int no = Integer.parseInt(request.getParameter("no"));
int kor = Integer.parseInt(request.getParameter("kor"));
int eng = Integer.parseInt(request.getParameter("eng"));
int math = Integer.parseInt(request.getParameter("math"));
// STDScoreDTO 객체에 정보 저장
STDScoreDTO dto = new STDScoreDTO();
dto.setNo(no);
dto.setName(name);
dto.setKor(kor);
dto.setEng(eng);
dto.setMath(math);
// STDScoreDAO 객체를 호출해서 STDScoreDTO 객체 정보를 DB에 전달
int result = STDScoreDAO.getInstance().update(dto);
if(result > 0) {
response.sendRedirect("student_score.jsp");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
4. DAO 수정
// public int delete() 메소드 아래에 update() 메소드 추가
public int update(STDScoreDTO dto) {
int result = 0;
Connection connec = null;
PreparedStatement prestat = null;
String sql = "UPDATE STD_SCORE SET NAME=?,KOR=?,ENG=?,MATH=? WHERE NO=?";
try {
// 1. Connection 얻어오기
connec = DBConnection.getInstance().getConnection();
// 2. 명령 처리 객체 획득
prestat = connec.prepareStatement(sql);
// 3. prestat으로 sql문의 빈 자리 채우기
prestat.setString(1, dto.getName());
prestat.setInt(2, dto.getKor());
prestat.setInt(3, dto.getEng());
prestat.setInt(4, dto.getMath());
prestat.setInt(5, dto.getNo());
// 4. DB에 데이터 전송(result = 처리된 행의 수)
result = prestat.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (prestat != null) {
prestat.close();
}
if (connec != null) {
connec.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
데이터 수정 테스트
- 수정 버튼을 누르면 수정 페이지로 넘어간다.
- student_score.jsp에서 전송한 학생의 데이터를 수정 페이지에서 그대로 출력하고 내용을 수정하면 std_modify.jsp로 정보를 전송한다.
- 여기서 수학 점수를 변경하고 수정 버튼을 눌러본다.
- 수정된 내용이 DB에 반영되었음을 확인할 수 있다.